// import storage from "./storage.js"
import format from "./format.js"
let Fw = {
	/**
	 * 是否登录
	 */
	isLogin: function() {
		if(uni.getStorageSync('Authorization')){
			return true;
		}else{
			return false;
		}
	},


	
	/**
	 * 是否已定义
	 * @param {} v
	 */
	isDefined: function(v) {
		return typeof v !== 'undefined';
	},
	/**
	 * 是否为空
	 * @param {} v
	 * @param {} allowBlank
	 */
	isEmpty: function(v, allowBlank) {
		if (this.isObject(v)) {
			var name;
			for (name in v) {
				return false;
			}
			return true;
		}
		if (this.isArray(v)) {
			return !v.length;
		}
		return v === null || v === undefined || String(v).toUpperCase() === 'NULL' || (!allowBlank ? v === '' :
			false);
	},
	/**
	 * 是否是数组
	 * @param {} v
	 */
	isArray: function(v) {
		return Fw.toString(v) === '[object Array]';
	},
	/**
	 * 转换为字符
	 * @param {Object} v
	 */
	toString(v) {
		return Object.prototype.toString.apply(v);
	},
	/**
	 * 是否是函数
	 * @param {} v
	 */
	isFunction(v) {
		return this.toString(v) === '[object Function]';
	},
	/**
	 * 是否是数值型
	 * @param {} v
	 */
	isNumber: function(v) {
		return typeof v === 'number' && isFinite(v);
	},
	/**
	 * 是否是日期
	 * @param {} v
	 */
	isDate: function(v) {
		return Fw.toString(v) === '[object Date]' && String(v) !== 'Invalid Date';
	},
	/**
	 * 防抖
	*/
	    debounce :function(func, delay) {
	      let timeoutId;
	
	      return function (...args) {
	        const context = this;
	
	        clearTimeout(timeoutId);
	
	        timeoutId = setTimeout(function () {
	          func.apply(context, args);
	        }, delay);
	      }
	},
	/**
	 * 节流
	*/
	    throttle :function(func, limit) {
	      let inThrottle;
	
	      return function (...args) {
	        const context = this;
	
	        if (!inThrottle) {
	          func.apply(context, args);
	          inThrottle = true;
	
	          setTimeout(() => {
	            inThrottle = false;
	          }, limit);
	        }
	      };
	    },
	/**
	 * 是否是对象
	 * @param {} v
	 */
	isObject(v) {
		return !!v && this.toString(v) === '[object Object]' && !this.isNumber(v.length) && !this.isFunction(v
			.splice) && (!this
			.isFunction(v.propertyIsEnumerable) || !v.propertyIsEnumerable('splice'));
	},
	/**
	 * 属性复制（同jQuery的$.extend）
	 * @param {} object
	 * @param {} config
	 * @param {} defaults
	 */
	apply(object, config, defaults) {
		if (defaults) {
			this.apply(object, defaults);
		}
		if (object && config && this.isObject(config)) {
			for (var property in config) {
				object[property] = config[property];
			}
		}
		return object;
	},

format
}

/**
 * 重写String
 */
Fw.apply(String.prototype, {
	/**
	 * 替换全部
	 */
	replaceAll: function(oldStr, newStr) {
		return this.replace(new RegExp(oldStr, 'gm'), newStr);
	},
	/**
	 * 去掉两端空格
	 * @param  all 是否全部（true全部，默认false）
	 */
	trim: function(all) {
		if (all === true) {
			// 全部
			return this.replaceAll(' ', '');
		} else {
			// 两端
			return this.replace('/(^/s*)|(/s*$)/g', '');
		}
	},
	/**
	 * 去掉左端空格
	 */
	leftTrim: function() {
		return this.replace('/(^[//s]*)/g', '');
	},
	/**
	 * 去掉右端空格
	 */
	rightTrim: function() {
		return this.replace('/([//s]*$)/g', '');
	},
	/**
	 * 是否以指定的字符串开始
	 */
	startsWith: function(str) {
		return this.substr(0, str.length) === str;
	},
	/**
	 * 是否以指定的字符串结束
	 */
	endsWith: function(str) {
		return this.substr(this.length - str.length) === str;
	},
	/**
	 * 首字母大写
	 */
	capitalize: function() {
		return this.charAt(0).toUpperCase() + this.substr(1);
	},
	/**
	 * 首字母小写
	 */
	uncapitalize: function() {
		return this.charAt(0).toLowerCase() + this.substr(1);
	},
	/**
	 * 复制
	 */
	repeat: function(count, sep) {
		if (count < 1) {
			count = 0;
		}
		for (var buf = [], i = count; i--;) {
			buf.push(this);
		}
		return buf.join(sep || '');
	},
	/**
	 * 格式化
	 */
	format: function() {
		var args = arguments;
		return this.replace(/\{(\d+)\}/g, function(m, i) {
			return args[i];
		});
	},

});

/**
 * 重写Date
 */
Fw.apply(Date.prototype, {
	/**
	 * 当前时间
	 */
	now: Date.now || function() {
		return +new Date();
	},
	/**
	 * 格式化
	 */
	format: function(mask) {
		var d = this;
		var zeroize = function(value, length) {
			if (!length) length = 2;
			value = String(value);
			for (var i = 0, zeros = ''; i < (length - value.length); i++) {
				zeros += '0';
			}
			return zeros + value;
		};
		return mask.replace(/"[^"]*"|'[^']*'|\b(?:d{1,4}|M{1,4}|yy(?:yy)?|([hHmMstT])\1?|[lLZ])\b/g,
			function($0) {
				switch ($0) {
					case 'd':
						return d.getDate();
					case 'dd':
						return zeroize(d.getDate());
					case 'ddd':
						return ['Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sat'][d.getDay()];
					case 'dddd':
						return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday',
							'Saturday'
						][d.getDay()];
					case 'M':
						return d.getMonth() + 1;
					case 'MM':
						return zeroize(d.getMonth() + 1);
					case 'MMM':
						return ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct',
							'Nov', 'Dec'
						][d.getMonth()];
					case 'MMMM':
						return ['January', 'February', 'March', 'April', 'May', 'June', 'July',
							'August', 'September', 'October', 'November', 'December'
						][d.getMonth()];
					case 'yy':
						return String(d.getFullYear()).substr(2);
					case 'yyyy':
						return d.getFullYear();
					case 'h':
						return d.getHours() % 12 || 12;
					case 'hh':
						return zeroize(d.getHours() % 12 || 12);
					case 'H':
						return d.getHours();
					case 'HH':
						return zeroize(d.getHours());
					case 'm':
						return d.getMinutes();
					case 'mm':
						return zeroize(d.getMinutes());
					case 's':
						return d.getSeconds();
					case 'ss':
						return zeroize(d.getSeconds());
					case 'l':
						return zeroize(d.getMilliseconds(), 3);
					case 'L':
						var m = d.getMilliseconds();
						if (m > 99) {
							m = Math.round(m / 10);
						}
						return zeroize(m);
					case 'tt':
						return d.getHours() < 12 ? 'am' : 'pm';
					case 'TT':
						return d.getHours() < 12 ? 'AM' : 'PM';
					case 'Z':
						return d.toUTCString().match(/[A-Z]+$/);
					default:
						return $0.substr(1, $0.length - 2);
				}
			});
	}
});

export default Fw
